From e9041e1e82fa07641ac9e09b6db8ed898b4256da Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 10 Aug 2005 12:56:47 +0000 Subject: [PATCH] Fix time handling on x86/64. Signed-off-by: Keir Fraser --- linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c | 8 ++++++++ xen/arch/x86/time.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c b/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c index e188d0bcbf..e7da29dede 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c @@ -173,13 +173,16 @@ struct timer_opts timer_tsc = { static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift) { u64 product; +#ifdef __i386__ u32 tmp1, tmp2; +#endif if ( shift < 0 ) delta >>= -shift; else delta <<= shift; +#ifdef __i386__ __asm__ ( "mul %5 ; " "mov %4,%%eax ; " @@ -190,6 +193,11 @@ static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift) "adc %5,%%edx ; " : "=A" (product), "=r" (tmp1), "=r" (tmp2) : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); +#else + __asm__ ( + "mul %%rdx ; shrd $32,%%rdx,%%rax" + : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) ); +#endif return product; } diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index ade1f2f758..092a3d2f73 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -103,13 +103,16 @@ static inline u32 mul_frac(u32 multiplicand, u32 multiplier) static inline u64 scale_delta(u64 delta, struct time_scale *scale) { u64 product; +#ifdef CONFIG_x86_32 u32 tmp1, tmp2; +#endif if ( scale->shift < 0 ) delta >>= -scale->shift; else delta <<= scale->shift; +#ifdef CONFIG_X86_32 __asm__ ( "mul %5 ; " "mov %4,%%eax ; " @@ -120,6 +123,11 @@ static inline u64 scale_delta(u64 delta, struct time_scale *scale) "adc %5,%%edx ; " : "=A" (product), "=r" (tmp1), "=r" (tmp2) : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (scale->mul_frac) ); +#else + __asm__ ( + "mul %%rdx ; shrd $32,%%rdx,%%rax" + : "=a" (product) : "0" (delta), "d" ((u64)scale->mul_frac) ); +#endif return product; } -- 2.30.2